﻿//#include "Heap.h"
////数据从下往上调整
//void AdjustUp(int* a, int child)//child是孩子，a是顺序表
//{
//	int parent = (child - 1) / 2;
//	while (child > 0)
//	{
//		//大堆树状规则排序法
//		if (a[child] > a[parent])
//		{
//			//交换
//			int t = a[child];
//			a[child] = a[parent];
//			a[parent] = t;
//			//继续下一次往上遍历
//			child = parent;
//			parent = (parent - 1) / 2;
//		}
//		//因为一开始就是不断向上面排序，树状序列都已经排序好了，当满足排序要求时说明都已经满足了
//		else
//		{
//			break;
//		}
//	}
//}
////数据从上往下调整
//void AdjustDown(int* a, int n, int parent)//a是顺序表，n是大小，parent是双亲
//{
//	int child = parent * 2 + 1;
//	while (child < n)
//	{
//		//大堆树状规则排序法
//		// 找出小的那个孩子，在这里要注意的是控制下一个孩子结点的不能超出范围
//		if (child + 1 < n && a[child + 1] > a[child])
//		{
//			++child;
//		}
//		if (a[child] > a[parent])
//		{
//			//交换
//			int t = a[child];
//			a[child] = a[parent];
//			a[parent] = t;
//			// 继续往下调整
//			parent = child;
//			child = parent * 2 + 1;
//		}
//		else
//		{
//			break;
//		}
//	}
//}
////输出堆
//void HeapPrint(HP* php)
//{
//	assert(php);
//	fprintf(stdout, "堆的数据: ");
//	for (int i = 0; i < php->size; i++) {
//		fprintf(stdout, "%d ", php->a[i]);
//	}
//	puts("");
//}
////堆的初始化
//void HeapInit(HP* php)
//{
//	assert(php);
//	php->a = 0;
//	php->size = php->capacity = 0;
//}
////堆的构建
//void HeapInitArray(HP* php, int* a, int n)
//{
//	assert(php && a);
//	php->a = (int*)malloc(sizeof(int) * n);
//	if (!php->a)
//	{
//		perror("php->a malloc");
//		exit(-1);
//	}
//	php->capacity = n;
//	memcpy(php->a, a, sizeof(int) * n);
//	php->size = n;
//	//建立堆,即进行排序，在这里以向上调整算法进行树状排布
//	for (int i = 1; i < php->size; i++)
//	{
//		AdjustUp(php->a, i);
//	}
//}
////大堆的构造
//int main()
//{
//	int a[] = { 2,3,5,7,4,6,8 };
//	HP* p = (HP*)malloc(sizeof(HP));//建立堆结构p，在这里以顺序表结构进行存储
//	HeapInit(p);//初始化
//	HeapInitArray(p, a, sizeof(a) / sizeof(int));//进行堆的构造
//	HeapPrint(p);//输出堆
//	return 0;
//}